package cn.tedu.thread;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class SellerTicketDemo {
    public static void main(String[] args) throws IOException {

        //读取配置文件
        Properties p=new Properties();
        p.load(new FileInputStream("ticket.properties"));
        //根据键返回值
        String count=p.getProperty("count");

        //创建代表票的类的对象
        Ticket t=new Ticket();
        //设置票数
        t.setCount(Integer.parseInt(count));
        //创建四个Runnable实现类对象---四个售票员
        Seller s1=new Seller(t);
        Seller s2=new Seller(t);
        Seller s3=new Seller(t);
        Seller s4=new Seller(t);

        //创建四个线程对象
        Thread t1=new Thread(s1,"A");
        Thread t2=new Thread(s2,"B");
        Thread t3=new Thread(s3,"C");
        Thread t4=new Thread(s4,"D");

        //开启线程
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}


//定义类---描述线程任务信息
class Seller implements Runnable{

    //票数
    //private static int ticket=100;

    //声明代表票的类的对象
    private Ticket t;

    //有参构造---保证创建的对象共有同一个Ticket类对象
    public Seller(Ticket t){
        this.t=t;
    }

    //重写run方法---任务信息（卖票）
    @Override
    public void run() {

        //死循环
        while (true) {
        //同步代码块锁
        //()---锁对象，线程对象共享进来
        synchronized (Math.class) {//t 可以把当前参与的所有线程对象共享进来
                                     //方法区资源 Seller.class String.class


                //循环结束条件
                if(t.getCount()==0)
                    break;
                //每次卖一张票
                t.setCount(t.getCount() - 1);
                //Thread.currentThread().getName()---当前正在执行的线程对象的名称
                System.out.println(Thread.currentThread().getName()
                        + "卖了一张票，还剩" + t.getCount() + "张票...");


                //线程休眠
                try {
                    Thread.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}


//类表示票
class Ticket{
    //属性--代表票数
    private int count;

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}







